package workflow

import "strconv"

// NewPipeline 创建一个新流程处理器
func NewPipeline() *Pipeline {
	return &Pipeline{
		Dag:                  NewDag(),
		ExecutePosition:      make(map[string]string),
		ExecuteDepth:         0,
		CurrentDynamicOption: make(map[string]string),
	}
}

// CountNodes 统计节点数量
func (p *Pipeline) CountNodes() int {
	return len(p.Dag.NodeMap)
}

// GetNodes 获取所有动态节点
func (p *Pipeline) GetNodes() []string {
	return p.Dag.GetDynamicNodes("")
}

// GetStartNode 获取开始节点
func (p *Pipeline) GetStartNode() string {
	startNode := p.Dag.GetStartNode()
	if startNode != nil {
		return startNode.ID
	}
	return "0"
}

// GetNodeExecuteID 获取节点执行ID
func (p *Pipeline) GetNodeExecuteID(node *DagNode) string {
	// 这个问题待解决
	depth := 0
	dag := p.Dag
	for depth <= p.ExecuteDepth {
		node = dag.GetNode(p.ExecutePosition[strconv.Itoa(depth)])
		currentOptions := p.CurrentDynamicOption[node.ID]
		if node.subDag != nil {
			dag = node.subDag
		} else {
			dag = node.conditions[currentOptions]
		}
		depth++
	}
	return node.ID
}
